package com.itcam.daijia.driver.service.impl;

import com.itcam.daijia.driver.config.TencentCloudProperties;
import com.itcam.daijia.driver.service.CiService;
import com.itcam.daijia.model.vo.order.TextAuditingVo;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.ciModel.auditing.*;
import com.qcloud.cos.region.Region;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;

import static org.apache.commons.codec.binary.Base64.encodeBase64;

@Service
public class CiServiceImpl implements CiService {

    @Autowired
    private TencentCloudProperties tencentCloudProperties;

    /**
     * 图片审核
     * @param path
     * @return
     */
    @Override
    public Boolean imageAuditing(String path) {
        COSClient cosClient = this.getPrivateCOSClient();

        //1.创建任务请求对象
        ImageAuditingRequest request = new ImageAuditingRequest();
        //2.添加请求参数 参数详情请见 API 接口文档
        //2.1设置请求 bucket
        request.setBucketName(tencentCloudProperties.getBucketPrivate());
        //2.2设置审核策略 不传则为默认策略（预设）
        //request.setBizType("");
        //2.3设置 bucket 中的图片位置
        request.setObjectKey(path);
        //3.调用接口,获取任务响应对象
        COSClient client = this.getCosClient();
        ImageAuditingResponse response = client.imageAuditing(request);
        client.shutdown();
        //用于返回该审核场景的审核结果，返回值：0：正常。1：确认为当前场景的违规内容。2：疑似为当前场景的违规内容。
        if (!response.getPornInfo().getHitFlag().equals("0")
                || !response.getAdsInfo().getHitFlag().equals("0")
                || !response.getTerroristInfo().getHitFlag().equals("0")
                || !response.getPoliticsInfo().getHitFlag().equals("0")
        ) {
            return false;
        }
        return true;
    }

    /**
     * 文本审核
     * @param content 待审核的文本内容
     * @return 审核结果
     */
    @Override
    public TextAuditingVo textAuditing(String content) {
        // 如果传入的文本内容为空，则返回一个默认的审核结果
        if (!StringUtils.hasText(content)) {
            TextAuditingVo textAuditingVo = new TextAuditingVo();
            textAuditingVo.setResult("0");
            return textAuditingVo;
        }
        // 获取腾讯云对象存储（COS）客户端
        COSClient cosClient = this.getPrivateCOSClient();

        // 创建文本审核请求对象
        TextAuditingRequest request = new TextAuditingRequest();
        // 设置请求的存储桶名称
        request.setBucketName(tencentCloudProperties.getBucketPrivate());

        // 将文本内容转换为base64编码
        byte[] encoder = encodeBase64(content.getBytes());
        // 将编码后的字节数组转换为字符串
        String contentBase64 = new String(encoder);
        // 设置请求的输入内容为base64编码的文本
        request.getInput().setContent(contentBase64);
        // 设置审核的类型为所有类型
        request.getConf().setDetectType("all");

        // 调用COS客户端的文本审核接口，获取审核结果
        TextAuditingResponse response = cosClient.createAuditingTextJobs(request);
        // 从响应中获取审核任务的详细信息
        AuditingJobsDetail detail = response.getJobsDetail();
        // 创建一个文本审核结果对象，用于封装返回的审核结果
        TextAuditingVo textAuditingVo = new TextAuditingVo();
        // 如果审核任务的状态为成功，则处理审核结果
        if ("Success".equals(detail.getState())) {
            // 获取审核结果，0表示审核正常，1表示判定为违规敏感文件，2表示疑似敏感，建议人工审核
            String result = detail.getResult();
            // 初始化违规关键词字符串
            StringBuffer keywords = new StringBuffer();
            // 获取审核结果中的违规信息列表
            List<SectionInfo> sectionInfoList = detail.getSectionList();
            // 遍历违规信息列表，提取关键词
            for (SectionInfo sectionInfo : sectionInfoList) {
                // 获取色情信息的关键词
                String pornInfoKeyword = sectionInfo.getPornInfo().getKeywords();
                // 获取违法信息的关键词
                String illegalInfoKeyword = sectionInfo.getIllegalInfo().getKeywords();
                // 获取谩骂信息的关键词
                String abuseInfoKeyword = sectionInfo.getAbuseInfo().getKeywords();
                // 如果色情信息关键词不为空，则添加到关键词字符串中
                if (pornInfoKeyword.length() > 0) {
                    keywords.append(illegalInfoKeyword).append(",");
                }
                // 如果违法信息关键词不为空，则添加到关键词字符串中
                if (illegalInfoKeyword.length() > 0) {
                    keywords.append(abuseInfoKeyword).append(",");
                }
                // 如果谩骂信息关键词不为空，则添加到关键词字符串中
                if (abuseInfoKeyword.length() > 0) {
                    keywords.append(abuseInfoKeyword).append(",");
                }
            }
            // 设置审核结果对象的审核结果和关键词
            textAuditingVo.setResult(result);
            textAuditingVo.setKeywords(keywords.toString());
        }
        // 返回审核结果对象
        return textAuditingVo;
    }


    // ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

    /**
     * 获取私有存储桶的 COS 客户端
     * @return
     */
    private COSClient getPrivateCOSClient() {
        // 使用腾讯云配置中的 SecretId 和 SecretKey 创建 COS 凭证
        COSCredentials cred = new BasicCOSCredentials(tencentCloudProperties.getSecretId(), tencentCloudProperties.getSecretKey());
        // 创建客户端配置对象，设置地域为腾讯云配置中的区域
        ClientConfig clientConfig = new ClientConfig(new Region(tencentCloudProperties.getRegion()));
        // 建议设置使用 HTTPS 协议
        clientConfig.setHttpProtocol(HttpProtocol.https);
        // 使用凭证和客户端配置创建 COS 客户端
        COSClient cosClient = new COSClient(cred, clientConfig);
        // 返回创建的 COS 客户端
        return cosClient;
    }


    /**
     * 获取腾讯云对象存储（COS）客户端
     *
     * @return COS 客户端对象
     */
    public COSClient getCosClient() {
        // 从配置文件中获取腾讯云的 SecretId
        String secretId = tencentCloudProperties.getSecretId();
        // 从配置文件中获取腾讯云的 SecretKey
        String secretKey = tencentCloudProperties.getSecretKey();
        // 使用 SecretId 和 SecretKey 创建 COS 凭证
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
        // 设置存储桶所在的地域，这里从配置文件中获取
        Region region = new Region(tencentCloudProperties.getRegion());
        // 创建客户端配置对象，设置地域和 HTTP 协议
        ClientConfig clientConfig = new ClientConfig(region);
        // 建议设置使用 HTTPS 协议
        clientConfig.setHttpProtocol(HttpProtocol.https);
        // 使用凭证和客户端配置创建 COS 客户端
        COSClient cosClient = new COSClient(cred, clientConfig);
        // 返回创建的 COS 客户端
        return cosClient;
    }

}
